/*
 * @Author: hc
 * @Date: 2024-03-06 15:45:46
 * @LastEditTime: 2024-03-12 16:14:52
 * @LastEditors: hc
 * @Description: 条件节点组件 类型声明
 */
import { InternalNamePath } from 'antd/es/form/interface';

export enum ROW_PERMISSION_RELATION {
  AND = 'and',
  OR = 'or'
}

export const ROW_PERMISSION_RELATION_TEXT = {
  [ROW_PERMISSION_RELATION.AND]: '并',
  [ROW_PERMISSION_RELATION.OR]: '或'
} as const;

export interface IComponentProps<T> {
  /** 唯一标识 */
  rowKey: string;
  /** 编辑/查看状态 */
  disabled: boolean;
  /** 使用 Form.Item 时，中间的 NamePath */
  name: InternalNamePath;
  /** 自定义数据 */
  rowValues: T;
  /** 改变数据的方法 */
  onChange: (key: string, values: T) => void;
}

export interface IFilterValue<T> {
  /** 唯一标识 */
  key: string;
  /** 当前节点的层级，用于判断一些按钮的展示 */
  level?: number;
  /** 当前节点的条件关系，1 | 2 */
  type?: ROW_PERMISSION_RELATION;
  /** 当前节点禁用 */
  disabled?: boolean;
  /** Form 节点的相关的信息(子节点无条件节点时才有) */
  rowValues?: T;
  /** 子节点的信息(子节点存在条件节点时才有) */
  children?: IFilterValue<T>[];
}

export interface INormalProps<T> {
  /** 组件的值 */
  value?: IFilterValue<T>;
  /** 编辑状态 */
  disabled?: boolean;
  /** 节点层级最大层级 */
  maxLevel?: number;
  /** 节点最大子节点数量 */
  maxSize?: number;
  /** 自定义组件的初始值 */
  initValues?: T;
  /** 是否保留最后一条数据 */
  notEmpty?: { data: boolean; message?: string };
  /** 自定义组件 */
  component: (props: IComponentProps<T>) => React.ReactNode;
  /** 改变数据的方法 */
  onChange?: (value: IFilterValue<T> | undefined) => void;
}

export interface IDisabledProps<T> {
  /** 组件的值 */
  value?: IFilterValue<T>;
  /** 查看状态 */
  disabled: boolean;
  /** 自定义展示组件 */
  component: (props: IComponentProps<T>) => React.ReactNode;
  /** 改变数据的方法 */
  onChange?: (value: IFilterValue<T> | undefined) => void;
}

export type FilterRulesProps<T> = IDisabledProps<T> | INormalProps<T>;

export interface RulesControllerProps<T> {
  /** 组件的值 */
  value: IFilterValue<T> | undefined;
  /** 编辑/查看状态 */
  disabled?: boolean;
  /** 节点最深层级数 */
  maxLevel: number;
  /** 节点最大子节点数量 */
  maxSize: number;
  /** 自定义展示组件 */
  component: (props: IComponentProps<T>) => React.ReactNode;
  /** 新增节点 */
  onAddCondition: (value: { key: string; isOut?: boolean }) => void;
  /** 删除节点 */
  onDeleteCondition: (key: string) => void;
  /** 改变条件节点的值 */
  onChangeCondition: (key: string, type: ROW_PERMISSION_RELATION) => void;
  /** 改变自定义组件的数据 */
  onChangeRowValues: (key: string, values: T) => void;
}
